parser grammar AnasintXML;

options {
	output = AST;                            //salida producida por el analizador sintactico
	ASTLabelType=MiArbol;				// tipo de salida
	tokenVocab=AnalexXML;
	rewrite=true;
	
}


@header {
	package Principal;
	import MiArbol.*;
}


@rulecatch {
  
}

document : biblioteca^ EOF!;
    

//ATRIBUTO
atributo  : ATTRID ATTRIGUAL ATTRVALOR;

// BIBLIOTECA
biblioteca : abrir_biblioteca^ (libro)+ cerrar_biblioteca;
	
abrir_biblioteca :  TAG_EMP_ETIQ! BIBLIOTECA^ (ATRIBUTO)* TAG_CIERRA_ETIQ!;	

cerrar_biblioteca : TAG_EMP_FIN_ETIQ BIBLIOTECA TAG_CIERRA_ETIQ {System.out.println("Sale de Biblioteca");}	;	


//LIBRO
libro: abrir_libro^ (DATOS)* titulo autor editorial cerrar_libro;
	
abrir_libro : TAG_EMP_ETIQ! LIBRO^ (ATRIBUTO)* TAG_CIERRA_ETIQ!;

cerrar_libro : TAG_EMP_FIN_ETIQ LIBRO TAG_CIERRA_ETIQ {System.out.println("Sale de Libro");};	

//TITULO
titulo : abrir_titulo^ DATOS cerrar_titulo;
	
abrir_titulo : TAG_EMP_ETIQ! TITULO^ TAG_CIERRA_ETIQ!;

cerrar_titulo : TAG_EMP_FIN_ETIQ TITULO TAG_CIERRA_ETIQ {System.out.println("Sale de Titulo");};	
	
//AUTOR
autor : abrir_autor^ DATOS cerrar_autor;

abrir_autor : TAG_EMP_ETIQ! AUTOR^ TAG_CIERRA_ETIQ!;

cerrar_autor : TAG_EMP_FIN_ETIQ AUTOR TAG_CIERRA_ETIQ {System.out.println("Sale de Autor");};

//EDITORIAL
editorial : abrir_editorial^ DATOS cerrar_editorial;
		
abrir_editorial : TAG_EMP_ETIQ! EDITORIAL^ TAG_CIERRA_ETIQ!;

cerrar_editorial : TAG_EMP_FIN_ETIQ EDITORIAL TAG_CIERRA_ETIQ {System.out.println("Sale de Editorial");};
